package service

import (
	"errors"
	"fmt"
	"im/model"
	"im/utils"
	"math/rand"
	"time"
)

type UserService struct{}

func (s *UserService) Register(userFinder *model.User) (user model.User, err error) {
	// 检测手机号是否存在
	tmp := model.User{}
	res := utils.DB.Where("mobile = ?", userFinder.Mobile).First(&tmp)

	if tmp.ID != 0 {
		return tmp, errors.New("该手机号已经注册，请登录！")
	}
	//拼接数据，插入数据库
	tmp.Mobile = userFinder.Mobile
	tmp.Avatar = userFinder.Avatar
	tmp.NickName = userFinder.NickName
	//格式化字符串并且生成
	tmp.Salt = fmt.Sprintf("%06d", rand.Int31n(10000))
	tmp.PassWord = utils.MakePasswd(userFinder.PassWord, tmp.Salt)
	tmp.Sex = userFinder.Sex
	tmp.CreateAt = time.Now()
	res = utils.DB.Create(&tmp)
	// token 可以说一个随机数，其实我用过jwt生成token 这里先用随机数。
	// tmp.ToKen = fmt.Sprintf("%08d", rand.Int31n(10000000))
	if res.Error != nil {
		return tmp, res.Error
	}
	// 返回新用户信息
	return tmp, nil
}

func (s *UserService) Login(mobile, plainpwd string) (err error) {
	var userFinder model.User
	utils.DB.Where("mobile = ?", mobile).First(&userFinder)
	if userFinder.ID == 0 {
		return errors.New("该手机号还没有注册，请注册！")
	}
	if utils.ValidataPassWord(plainpwd, userFinder.Salt, userFinder.PassWord) {
		return nil
	} else {
		return errors.New("密码不正确！")
	}

}

//根据手机号更新单列，第二个参数是更新哪个字段。
// 注意数据库字段可是有下划线的。
func (s *UserService) UpdateSingleColumn(mobile, column string) (token string, err error) {
	token = fmt.Sprintf("%08d", rand.Int31n(10000000))
	utils.DB.Model(&model.User{}).Where("mobile = ?", mobile).Update(column, token)

	return token, nil
}

func (s *UserService) FindUser(user model.User) (model.User, error) {
	var finder model.User

	res := utils.DB.Where("mobile=?", user.Mobile).First(&finder)
	if res.Error != nil {
		return finder, errors.New("没有这个人")
	}
	return finder, nil
}
